home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 February: Technology Seed / Mac Tech Seed Feb '97.toast / OpenDoc 1.2b2c1 / TestParts / Clock / ClockGbl.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1997-01-01  |  14.8 KB  |  589 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        ClockGbl.cpp
  3.  
  4.     Contains:    xxx put contents here xxx
  5.  
  6.     Owned by:    Richard Rodseth
  7.  
  8.     Copyright:    © 1995 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     Change History (most recent first):
  11.  
  12.          <9>    10/16/95    RR        #1293067 Pass shouldDispose to
  13.                                     RegisterWindow
  14.          <8>     9/12/95    RR        Various activation problems. Added a
  15.                                     floating window
  16.          <7>      9/4/95    TJ        Added Includes to Compile with out
  17.                                     PC-Headers.
  18.          <6>      9/1/95    RR        # 1244639 Added fDisplaySettingsDialog &
  19.                                     RemovingFrame()
  20.          <5>     7/10/95    RR        Misc. cleanup and bug fixes for shared
  21.                                     window
  22.          <4>      7/7/95    RR        Some refactoring. Fix
  23.                                     CreatePropObjSpecifier to deal with
  24.                                     non-persistent frame. Set source frame of
  25.                                     dialogs.
  26.          <3>     6/30/95    RR        1242642 BB Ref counting fixes. Display
  27.                                     settings window is saved as an ID, not a
  28.                                     window
  29.          <2>      6/3/95    TJ        Added #includes for compile with out PCH
  30.          <1>     5/31/95    RR        first checked in
  31.  
  32.     To Do:
  33. */
  34.  
  35. #ifndef _CLOCKGBL_
  36. #include "ClockGbl.h"
  37. #endif
  38.  
  39. #ifndef _TEMPOBJ_
  40. #include "TempObj.h"
  41. #endif
  42.  
  43. #ifndef _ODMEMORY_
  44. #include "ODMemory.h"
  45. #endif
  46.  
  47. #ifndef _ODUTILS_
  48. #include "ODUtils.h"
  49. #endif
  50.  
  51. #ifndef SOM_ODPersistentObject_xh
  52. #include "PstObj.xh"
  53. #endif
  54.  
  55. #ifndef SOM_ODPart_xh
  56. #include "Part.xh"
  57. #endif
  58.  
  59. #ifndef SOM_ODFrame_xh
  60. #include "Frame.xh"
  61. #endif
  62.  
  63. #ifndef __STRINGS__
  64. #include <Strings.h>
  65. #endif
  66.  
  67. #ifndef __TEXTUTILS__
  68. #include <TextUtils.h>
  69. #endif
  70.  
  71. #ifndef SOM_ODSession_xh
  72. #include <ODSessn.xh>
  73. #endif
  74.  
  75. #ifndef _CLOCKDEF_
  76. #include "ClockDef.h"
  77. #endif
  78.  
  79. #ifndef _USERSRCM_
  80. #include "UseRsrcM.h"
  81. #endif
  82.  
  83. #ifndef SOM_ODWindowState_xh
  84. #include <WinStat.xh>
  85. #endif
  86.  
  87. #ifndef SOM_ODDispatcher_xh
  88. #include <Disptch.xh>
  89. #endif
  90.  
  91. #ifndef __DIALOGS__
  92. #include "Dialogs.h"
  93. #endif
  94.  
  95. #ifndef SOM_ODWindow_xh
  96. #include <Window.xh>
  97. #endif
  98.  
  99. #ifndef _ORDCOLL_
  100. #include <OrdColl.h>
  101. #endif
  102.  
  103. #ifndef _CLOCKFRM_
  104. #include "ClockFrm.h"
  105. #endif
  106.  
  107. ClockGlobals* gClockGlobals = kODNULL;
  108.  
  109. //=========================================================================
  110. // Class ClockGlobals
  111. //=========================================================================
  112.  
  113. ClockGlobals::ClockGlobals()
  114. {
  115.     fRefCount = 0;
  116.     fMenuBar = kODNULL;
  117.     fDisplaySettingsWindow = kODNULL;
  118.     fDispaySettingsDialog = kODNULL;
  119.     fSession = kODNULL;
  120.     fDialogFrames = kODNULL;
  121. }
  122.  
  123. ClockGlobals::~ClockGlobals()
  124. {
  125. }
  126.     
  127. void ClockGlobals::InitClockGlobals(Environment* ev, ODSession* session, ODPart* part)
  128. {
  129.     fSession = session;
  130.     fFrameView = fSession->Tokenize(ev, kODViewAsFrame);
  131.     fDisplaySettingsPresentation   = fSession->Tokenize(ev, kDisplaySettingsFrame);
  132.     fAlarmSettingsPresentation   = fSession->Tokenize(ev, kAlarmSettingsFrame);
  133.     fDialogFrames = new OrderedCollection;            
  134. }
  135.  
  136. void ClockGlobals::AcquireGlobals(Environment* ev)
  137. {
  138.     fRefCount++;
  139. }
  140.  
  141. void ClockGlobals::ReleaseGlobals(Environment* ev)
  142. {
  143.     fRefCount--;
  144.     if (fRefCount == 0)
  145.         this->FreeGlobals(ev);
  146. }
  147.  
  148. void ClockGlobals::FreeGlobals(Environment* ev)
  149. {
  150.     ODWindow* window = fSession->GetWindowState(ev)->AcquireWindow(ev, fDisplaySettingsWindow);
  151.     if (window)
  152.     {
  153.         window->CloseAndRemove(ev);
  154.     }
  155.     if (fDispaySettingsDialog)
  156.     {
  157.         //somPrintf("FreeGlobals::Deleting shared platform window\n");
  158.         CloseDialog(fDispaySettingsDialog);
  159.         ODDisposePtr(fDispaySettingsDialog);        
  160.     }
  161.  
  162.     ODDeleteObject(fDialogFrames);
  163.     gClockGlobals = kODNULL;
  164.     delete this;
  165. }
  166.  
  167. ODSession* ClockGlobals::GetSession(Environment* ev)
  168. {
  169.     return fSession;
  170. }
  171.  
  172. void ClockGlobals::CreateDisplaySettingsDialog(Environment* ev, ODFrame* sourceFrame)
  173. {
  174.     ODSLong savedRefNum;
  175.     ODWindow* settingsWindow = kODNULL;
  176.     ODPart* sourcePart = sourceFrame->AcquirePart(ev);
  177.     
  178.     BeginUsingLibraryResources(savedRefNum);
  179.     fDispaySettingsDialog = GetNewDialog(kClock_DisplaySettingsDialogID ,(Ptr)ODNewPtr(sizeof(DialogRecord)),(WindowPtr)-1L);
  180.     EndUsingLibraryResources(savedRefNum);
  181.     
  182.     settingsWindow = fSession->GetWindowState(ev)->
  183.                         RegisterWindow(ev, fDispaySettingsDialog, 
  184.                             kODNonPersistentFrameObject,
  185.                              kODFalse,    // Keeps draft open
  186.                              kODFalse,    // Is resizable
  187.                              kODFalse,    // Is floating
  188.                              kODFalse,    // don't save
  189.                              kODFalse,    // should dispose
  190.                              sourcePart, 
  191.                              fFrameView, // View Type
  192.                              fDisplaySettingsPresentation, // Presentation
  193.                              sourceFrame);
  194.  
  195.     
  196.     if (fDispaySettingsDialog && settingsWindow)
  197.     {
  198.         settingsWindow->Open(ev);
  199.         fDisplaySettingsWindow = settingsWindow->GetID(ev);
  200.         ODReleaseObject(ev, settingsWindow);
  201.     }
  202.     ODReleaseObject(ev, sourcePart);
  203. }
  204.  
  205. void ClockGlobals::CreateAlarmSettingsDialog(Environment* ev, ODFrame* sourceFrame)
  206. {
  207.     ODSLong savedRefNum;
  208.     ODWindow* settingsWindow = kODNULL;
  209.     ODPart* sourcePart = sourceFrame->AcquirePart(ev);
  210.     
  211.     BeginUsingLibraryResources(savedRefNum);
  212.     fAlarmSettingsDialog = GetNewDialog(kClock_AlarmSettingsDialogID ,(Ptr)ODNewPtr(sizeof(DialogRecord)),(WindowPtr)-1L);
  213.     EndUsingLibraryResources(savedRefNum);
  214.     
  215.     settingsWindow = fSession->GetWindowState(ev)->
  216.                         RegisterWindow(ev, fAlarmSettingsDialog, 
  217.                             kODNonPersistentFrameObject,
  218.                              kODFalse,    // Keeps draft open
  219.                              kODFalse,    // Is resizable
  220.                              kODFalse,    // Is floating
  221.                              kODFalse,    // don't save
  222.                              kODFalse,    // should dispose
  223.                              sourcePart, 
  224.                              fFrameView, // View Type
  225.                              fAlarmSettingsPresentation, // Presentation
  226.                              sourceFrame);
  227.  
  228.     
  229.     if (fAlarmSettingsDialog && settingsWindow)
  230.     {
  231.         settingsWindow->Open(ev);
  232.         fAlarmSettingsWindow = settingsWindow->GetID(ev);
  233.         ODReleaseObject(ev, settingsWindow);
  234.     }
  235.     ODReleaseObject(ev, sourcePart);
  236. }
  237.  
  238. void ClockGlobals::OpenDisplaySettingsDialog(Environment* ev,  ODFrame* sourceFrame)
  239. {
  240.     ODPart* sourcePart = sourceFrame->AcquirePart(ev);
  241.     ODWindow* window = fSession->GetWindowState(ev)->AcquireWindow(ev, fDisplaySettingsWindow);
  242.     if (window)
  243.     {
  244.         window->Show(ev);
  245.         window->Select(ev);
  246.         ODReleaseObject(ev, window);
  247.     }
  248.     else
  249.     {
  250.         this->CreateDisplaySettingsDialog(ev, sourceFrame);
  251.         this->OpenDisplaySettingsDialog(ev, sourceFrame); // Ooh. Sneaky
  252.     }    
  253.     ODReleaseObject(ev, sourcePart);
  254. }
  255.  
  256. void ClockGlobals::CloseDisplaySettingsWindow(Environment* ev)
  257. {
  258.     ODWindow* window = fSession->GetWindowState(ev)->AcquireWindow(ev, fDisplaySettingsWindow);
  259.     if (window)
  260.     {
  261.         window->Hide(ev);
  262.     }
  263.     ODReleaseObject(ev, window);
  264. }
  265.  
  266. void ClockGlobals::OpenAlarmSettingsDialog(Environment* ev, ODFrame* sourceFrame)
  267. {
  268.     ODPart* sourcePart = sourceFrame->AcquirePart(ev);
  269.     ODWindow* window = fSession->GetWindowState(ev)->AcquireWindow(ev, fAlarmSettingsWindow);
  270.     if (window)
  271.     {
  272.         window->Show(ev);
  273.         window->Select(ev);
  274.         ODReleaseObject(ev, window);
  275.     }
  276.     else
  277.     {
  278.         this->CreateAlarmSettingsDialog(ev, sourceFrame);
  279.         this->OpenAlarmSettingsDialog(ev, sourceFrame); // Ooh. Sneaky
  280.     }    
  281.     ODReleaseObject(ev, sourcePart);
  282.  
  283.  
  284. }
  285.  
  286. void ClockGlobals::CloseAlarmSettingsWindow(Environment* ev)
  287. {
  288.     ODWindow* window = fSession->GetWindowState(ev)->AcquireWindow(ev, fAlarmSettingsWindow);
  289.     if (window)
  290.     {
  291.         window->Hide(ev);
  292.     }
  293.     ODReleaseObject(ev, window);
  294. }
  295.  
  296. void ClockGlobals::AcquiringFocus(Environment* ev, ODFrame* activatingFrame)
  297. {
  298.     ODWindow* settingsWindow = fSession->GetWindowState(ev)->AcquireWindow(ev, fDisplaySettingsWindow);
  299.     if (settingsWindow)
  300.     {
  301.         ODPart* activatingPart = activatingFrame->AcquirePart(ev);
  302.         settingsWindow->GetRootFrame(ev)->ChangePart(ev, activatingPart);
  303.         settingsWindow->SetSourceFrame(ev, activatingFrame);
  304.         ODReleaseObject(ev, activatingPart);
  305.         
  306.     }
  307.     ODReleaseObject(ev, settingsWindow);
  308. }
  309.  
  310. void ClockGlobals::ResumeWindows(Environment* ev, ODBoolean processChange)
  311. {
  312. #if defined(ODDebug)
  313. //    somPrintf("ClockGlobals::ShowWindows\n");
  314. #endif
  315.     OrderedCollectionIterator iter(fDialogFrames);
  316.     
  317.     for (ODFrame* aFrame = (ODFrame*)iter.First(); 
  318.                             iter.IsNotComplete();
  319.                             aFrame = (ODFrame*)iter.Next())
  320.     {
  321.         ClockFrame* clockFrame = (ClockFrame*) aFrame->GetPartInfo(ev);
  322. #if defined(ODDebug)
  323. //    somPrintf("ClockGlobals::ShowWindows. Frame = %x\n", aFrame);
  324. #endif
  325.         if (processChange)
  326.             clockFrame->ResumeProcess(ev);
  327.         else
  328.             clockFrame->ResumeFocus(ev);
  329.     }
  330. }
  331.  
  332. void ClockGlobals::SuspendWindows(Environment* ev, ODBoolean processChange)
  333. {
  334. #if defined(ODDebug)
  335. //    somPrintf("ClockGlobals::HideWindows\n");
  336. #endif
  337.     OrderedCollectionIterator iter(fDialogFrames);
  338.     
  339.     for (ODFrame* aFrame = (ODFrame*)iter.First(); 
  340.                             iter.IsNotComplete();
  341.                             aFrame = (ODFrame*)iter.Next())
  342.     {
  343.         ClockFrame* clockFrame = (ClockFrame*) aFrame->GetPartInfo(ev);
  344. #if defined(ODDebug)
  345. //    somPrintf("ClockGlobals::HideWindows. Frame = %x\n", aFrame);
  346. #endif
  347.         if (processChange)
  348.             clockFrame->SuspendProcess(ev);
  349.         else
  350.             clockFrame->SuspendFocus(ev);
  351.     }
  352.  
  353. }
  354.  
  355. void ClockGlobals::RemovingFrame(Environment* ev, ODFrame* frame)
  356. {
  357. /*    TempODWindow window = fWindowState->AcquireWindow(ev, fDisplaySettingsWindow);
  358.     if (window)
  359.     {
  360.         TempODPart displayWinRootPart = window->GetRootFrame(ev)->AcquirePart(ev);
  361.             // -- TÇ tempobj'd
  362.         if (displayWinRootPart == fClockPart->GetPartWrapper())
  363.         {
  364.             window->CloseAndRemove(ev);
  365.             window = kODNULL; //!!!!! Otherwise Temp obj does extra release
  366.             gClockGlobals->fDisplaySettingsWindow = 0;
  367.         }
  368.     }
  369. */
  370.     TempODWindow window = fSession->GetWindowState(ev)->AcquireWindow(ev, fDisplaySettingsWindow);
  371.     if (window)
  372.     {
  373.         TempODFrame sourceFrame = window->AcquireSourceFrame(ev);
  374.         if (ODObjectsAreEqual(ev, sourceFrame, frame))
  375.         {
  376.             window->CloseAndRemove(ev);
  377.             window = kODNULL; //!!!!! Otherwise Temp obj does extra release
  378.             fDisplaySettingsWindow = 0;
  379.         }
  380.     }
  381.  
  382. }
  383.  
  384. void ClockGlobals::AddDialogFrame(Environment* ev, ODFrame* frame)
  385. {
  386.     if (fDialogFrames)
  387.     {
  388.         if (!fDialogFrames->Contains(frame))
  389.         {
  390. #if defined(ODDebug)
  391. //    somPrintf("Adding Dialog Frame %x\n", frame);
  392. #endif
  393.             fDialogFrames->AddLast(frame);
  394.             frame->Acquire(ev);
  395.         }
  396.     }
  397. }
  398.  
  399. void ClockGlobals::RemoveDialogFrame(Environment* ev, ODFrame* frame)
  400. {
  401.     if (fDialogFrames && fDialogFrames->Contains(frame))
  402.     {
  403. #if defined(ODDebug)
  404. //    somPrintf("Removing Dialog Frame %x\n", frame);
  405. #endif
  406.         fDialogFrames->Remove(frame);
  407.         ODReleaseObject(ev, frame);
  408.     }
  409. }
  410.  
  411. void ClockGlobals::AdjustDialogs(Environment* ev)
  412. {
  413.     OrderedCollectionIterator iter(fDialogFrames);
  414.     
  415.     for (ODFrame* aFrame = (ODFrame*)iter.First(); 
  416.                             iter.IsNotComplete();
  417.                             aFrame = (ODFrame*)iter.Next())
  418.     {
  419.         ClockFrame* clockFrame = (ClockFrame*) aFrame->GetPartInfo(ev);
  420.         clockFrame->Adjust(ev);
  421.     }
  422. }
  423.  
  424. //-------------------------------------------------------------------------
  425. // Utilities
  426. //-------------------------------------------------------------------------
  427.  
  428.  
  429. //------------------------------------------------------------------------------
  430. // CheckMarkMenu
  431. //------------------------------------------------------------------------------
  432.  
  433. void CheckMarkMenu(MenuHandle menu, Str255 checkItem, ODBoolean checkIt)
  434. {
  435.     ODSShort      numMenuItems = CountMItems( menu );
  436.     Str255      menuItemString;
  437.     
  438.     for (ODSShort menuItemNum = 1; menuItemNum <= numMenuItems; menuItemNum++)
  439.     {
  440.         GetMenuItemText( menu, menuItemNum, menuItemString );
  441.         
  442.         if ( IUEqualString(checkItem, menuItemString) == 0 )
  443.         {
  444.             if ( checkIt )
  445.                 CheckItem( menu, menuItemNum, kODTrue );
  446.             else
  447.                 CheckItem( menu, menuItemNum, kODFalse );
  448.         }
  449.     }
  450. }
  451.  
  452.  
  453. //------------------------------------------------------------------------------
  454. // StyleToString
  455. //------------------------------------------------------------------------------
  456.  
  457.  
  458. void StyleToString(ODUByte    style,
  459.                           Str255*    styleName )
  460. {
  461.     char tStyleStr[12];
  462.     
  463.     switch (style) {
  464.         case normal:    strcpy((char *)&tStyleStr ,"Plain\0"); break;                // • • Move to resource
  465.         case bold:        strcpy((char *)&tStyleStr ,"Bold\0"); break;                // • • for localization
  466.         case italic:    strcpy((char *)&tStyleStr ,"Italic\0"); break;                // • • purposes
  467.         case underline:    strcpy((char *)&tStyleStr ,"Underline\0"); break;
  468.         case outline:    strcpy((char *)&tStyleStr ,"Outline\0"); break;
  469.         case shadow:    strcpy((char *)&tStyleStr ,"Shadow\0"); break;
  470.         case condense:    strcpy((char *)&tStyleStr ,"Condense\0"); break;
  471.         case extend:    strcpy((char *)&tStyleStr ,"Extend\0"); break;
  472.         default:
  473.             strcpy((char *)&tStyleStr ,"Plain\0");
  474.     }
  475.     
  476.     BlockMove((Ptr)c2pstr((char *)&tStyleStr),(Ptr)styleName,12);
  477. }
  478.  
  479. //------------------------------------------------------------------------------
  480. // AboutDialogFilter
  481. //------------------------------------------------------------------------------
  482.  
  483. pascal Boolean AboutDialogFilter(DialogPtr dialog,
  484.                               EventRecord* event,
  485.                               short* itemHit)
  486. {
  487.     ODBoolean handled = kODFalse;
  488.     
  489.     Environment* ev = somGetGlobalEnvironment();
  490.     
  491.     if (event->what == nullEvent)
  492.     {
  493.         gClockGlobals->GetSession(ev)->GetDispatcher(ev)->Dispatch(ev, (ODEventData*)event);
  494.     }
  495.     else if (event->what == updateEvt &&
  496.                 (WindowPtr) event->message != dialog)        
  497.     {
  498.         gClockGlobals->GetSession(ev)->GetDispatcher(ev)->Dispatch(ev, (ODEventData*)event);
  499.     }
  500.     else if (event->what == activateEvt &&
  501.                 (WindowPtr) event->message != dialog)        
  502.     {
  503.     //$$$$$ Is this serving any purpose?
  504.         gClockGlobals->GetSession(ev)->GetDispatcher(ev)->Dispatch(ev, (ODEventData*)event);
  505.     }
  506.     else if (event->what == mouseDown) 
  507.     {
  508.         handled = kODTrue;
  509.         *itemHit = 0;
  510.     }
  511.     else if (event->what == mouseUp) 
  512.     {
  513.         handled = kODTrue;
  514.         *itemHit = 1;
  515.     }
  516.     else if ((event->what == keyDown) || (event->what == autoKey))
  517.     {
  518.         handled = kODTrue;
  519.         *itemHit = 1;
  520.         
  521.     }
  522.  
  523.     return handled;
  524. }
  525.  
  526. //------------------------------------------------------------------------------
  527. // ClockDialogFilter
  528. //------------------------------------------------------------------------------
  529.  
  530. pascal Boolean ClockDialogFilter(DialogPtr dialog,
  531.                               EventRecord* event,
  532.                               short* itemHit)
  533. {
  534.     ODBoolean handled = kODFalse;
  535.     
  536.     Environment* ev = somGetGlobalEnvironment();
  537.     
  538.     if (event->what == nullEvent)
  539.     {
  540.         gClockGlobals->GetSession(ev)->GetDispatcher(ev)->Dispatch(ev, (ODEventData*)event);
  541.     }
  542.     else if (event->what == updateEvt &&
  543.                 (WindowPtr) event->message != dialog)        
  544.     {
  545.         gClockGlobals->GetSession(ev)->GetDispatcher(ev)->Dispatch(ev, (ODEventData*)event);
  546.     }
  547.     else if (event->what == activateEvt &&
  548.                 (WindowPtr) event->message != dialog)        
  549.     {
  550.         gClockGlobals->GetSession(ev)->GetDispatcher(ev)->Dispatch(ev, (ODEventData*)event);
  551.     }
  552.     else if ((event->what == keyDown) || (event->what == autoKey))
  553.     {
  554.         #define kMyButtonDelay 8
  555.         long    waitTicks;
  556.         short    itemKind;
  557.         Handle    itemHandle;
  558.         Rect    itemRect;
  559.         char key = (char)(event->message & charCodeMask);
  560.         const char kReturnKey = 13;
  561.         const char kEnterKey = 3;
  562.         const char kEscKey = 27;
  563.         
  564.         switch(key)
  565.         {
  566.             case kReturnKey:
  567.             case kEnterKey:
  568.                 /* change whatever is the current item is to the OK item */
  569.                 *itemHit = ok;
  570.                 GetDialogItem(dialog,ok,&itemKind,&itemHandle,&itemRect);
  571.                 HiliteControl((ControlHandle)itemHandle,kControlButtonPart);
  572.                 Delay(kMyButtonDelay,&waitTicks);/* wait about 8 ticks */
  573.                 HiliteControl((ControlHandle)itemHandle,kODFalse);
  574.                 handled = kODTrue;
  575.                 break;
  576.             case kEscKey:
  577.                 *itemHit = cancel;
  578.                 GetDialogItem(dialog,cancel,&itemKind,&itemHandle,&itemRect);
  579.                 HiliteControl((ControlHandle)itemHandle,kControlButtonPart);
  580.                 Delay(kMyButtonDelay,&waitTicks);
  581.                 HiliteControl((ControlHandle)itemHandle,kODFalse);
  582.                 handled = kODTrue;
  583.                 break;
  584.         }
  585.     }
  586.  
  587.     return handled;
  588. }
  589.